/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package educar.abmDedicacion;

import educar.controllers.PrincipalController;
import educar.db.JPA;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;

/**
 *Esta clase funciona como mediador (escuchador), resepta(captura) los eventos de acciones,
 * de mouse y de ventana, esta clase se comunica con las clases ModificarDedicacionController,
 * EliminarDedicacionController y AgregarDedicacionController, la clase DedicacionController es 
 * invocada por la clase principal del sistema, la PrincipalController.
 * @author Flubber
 */
public class DedicacionController implements ActionListener,MouseListener, WindowListener {
            
    //Atributo usado para crear una instacia de la clase principal del Sistema      
    private PrincipalController principalController;
    
    //Atributo usado para crer una vista de resolucion (ventana)    
    private DedicacionView dedicacionView;

// <editor-fold defaultstate="collapsed" desc="Constructor">
    /**
     * <hr>
     * DedicacionController(): Constructor de la clase DedicacionController
     * <hr>
     * @param principalControl 
     */     
    public DedicacionController(PrincipalController principalControl){ 
        principalController = principalControl;
        dedicacionView = new DedicacionView();
        dedicacionView.setActionListener(this);
        dedicacionView.setMouseListener(this);
        dedicacionView.setWindowListener(this);
    }
 // </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Action setView">    
    /**
     * <hr>
     * setView(): Hace visible a una ventana de dedicacion.
     * <hr>
     */     
    public void setView() {
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        int x = 0;
        int y = 50;
        dedicacionView.setBounds(x, y, screen.width, (screen.height)-90);
        dedicacionView.setModeloTabla(listarDedicacion());
        dedicacionView.setVisible(true);
    }
// </editor-fold>    

// <editor-fold defaultstate="collapsed" desc="Metodos ActionPermormed">    
    /**
     * <hr>
     * actionPerformed():metodo que recibe un evento de un boton y dependiendo de
     * este este evento puede agregar, eliminar o buscar una dedicacion.
     * <hr>
     * @param e 
     */     
    @Override
    public void actionPerformed(ActionEvent e) {
        //Atributo usado para verificar procedencia (boton)         
        Object source = e.getSource();
        if (dedicacionView.getJbAgregar() == source) {    //Boton Agregar
                AgregarDedicacionController agregarDedicacionController = new AgregarDedicacionController(this);
                agregarDedicacionController.setView();
        }
        
        if (dedicacionView.getJbEliminar() == source) {    //Boton Eliminar
            EliminarDedicacionController eliminarDedicacionController = new EliminarDedicacionController();
            eliminarDedicacionController.eliminarRegistro(dedicacionView.getModeloTabla());
        }    
        
        if (dedicacionView.getJbBuscar() == source) {    //Boton Buscar
            dedicacionView.setModeloTabla(null);
            if (dedicacionView.getCriterios()[0].isEmpty() && dedicacionView.getCriterios()[1].isEmpty()){
                dedicacionView.setModeloTabla(listarDedicacion());
            }
            if (!(dedicacionView.getCriterios()[0].isEmpty()) && dedicacionView.getCriterios()[1].isEmpty()){
                dedicacionView.setModeloTabla(buscarDedicacionByColumn("DNIdocente", dedicacionView.getCriterios()[0]));
            }
            if (dedicacionView.getCriterios()[0].isEmpty() && !(dedicacionView.getCriterios()[1].isEmpty())){
                dedicacionView.setModeloTabla(buscarDedicacionByColumn("codFacultad", dedicacionView.getCriterios()[1]));
            }
            if (!(dedicacionView.getCriterios()[0].isEmpty()) && !(dedicacionView.getCriterios()[1].isEmpty())){
                dedicacionView.setModeloTabla(buscarDedicacionByKeys(dedicacionView.getCriterios()));
            }
        }       
    }//Fin del metodo actionPerformed()
    
    /**
     * <hr>
     * mouseClicked(): Metodo usado para detectar el evento del mouse en la ventana de dedicacion
     * <hr>
     * @param e 
     */   
    @Override
    public void mouseClicked(MouseEvent e) {
        //Atributo usado para verificar procedencia          
        Object source = e.getSource();
        if ((dedicacionView.getJTDedicacion() == source) && (e.getClickCount()==2)) {   //Tabla Dedicacion y Clickeado dos veces
            ModificarDedicacionController modificarDedicacionController = new ModificarDedicacionController(this);
            int fila = dedicacionView.getJTDedicacion().getSelectedRow();
            Vector registro = (Vector) (dedicacionView.getModeloTabla().getDataVector()).elementAt(fila);
            modificarDedicacionController.setView(registro, fila);
        }    
    }//Fin del metodo mouseClicked()
// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Metodos auxiliares usados">    
    /**
     * <hr>
     * AgregarATabla(): Agrega a la tabla de la ventana un elemento
     * <hr>
     * @param item elemento a agregar
     */      
    public void agregarATabla(String[] item){
        Object[] vector = new Object[5];
        vector[0] = (boolean) false;
        for (int i = 1; i < 5; i++){
            vector[i] = item[i-1];
        }
        dedicacionView.getModeloTabla().addRow(vector);
    }//Fin del metodo agregarATabla(String[])

    /**
     * <hr>
     * actualizarFila(): Modifica los atrubitos de un elemento de la tabla
     * <hr>
     * @param item elemento modificado
     * @param fila <code>int</code> con la fila en onde se encuentra el elemento a modificar
     */    
    public void actualizarFila(String[] item, int fila){
        dedicacionView.getModeloTabla().setValueAt(false, fila, 0);
        for (int i = 1; i < 5; i++){
            dedicacionView.getModeloTabla().setValueAt(item[i-1], fila, i);
        }
    }//Fin del metodo actualizarFila(String[], int)
    
    /**
     * <hr>
     * listarDedicacion(): Lista todas las dedicaciones de la base de datos en la tabla
     * <hr>
     * @return DefaultTableModel la tabla con todas las dedicaciones
     */    
    public DefaultTableModel listarDedicacion() {
            JPA jpa = new JPA();
            Object[] vector = new Object[5];
            DefaultTableModel tabla = (DefaultTableModel) dedicacionView.getJTDedicacion().getModel(); 
            ResultSet res = jpa.showAll("pertenece");
            try {
                while (res.next()) {
                    vector[0] = false;
                    vector[1] = res.getObject(1);
                    vector[2] = res.getObject(2);
                    vector[3] = res.getObject(3);
                    vector[4] = res.getObject(4);
                    tabla.addRow(vector);
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            return tabla;
    }//Fin del metodo listarUser() 
         
    /**
     * <hr>
     * Lista todas las dedicaciones que tiene como valor el criterio en la columna column.
     * <hr>
     * @param column: es la columna por la cual va a buscar el criterio
     * @param criterio: es el criterio de una dedicacion a buscar
     * @return DefaultTableModel la tabla con todas las dedicaciones que cumplen con dicho criterio
     */
    public DefaultTableModel buscarDedicacionByColumn(String column, String criterio) {
        JPA jpa = new JPA();
        Object[] vector = new Object[5];
        DefaultTableModel tabla = (DefaultTableModel) dedicacionView.getModeloTabla(); 
        ResultSet res = jpa.showLike("pertenece", column, criterio);
        try {
            while (res.next()) {    //Existe siguiente registro.
                vector[0] = false;
                vector[1] = res.getObject(1);
                vector[2] = res.getObject(2);
                vector[3] = res.getObject(3);
                vector[4] = res.getObject(4); 
                tabla.addRow(vector);
            }
         } catch (SQLException ex) { //No existe siguiente registro.
            ex.printStackTrace();
         }
         return tabla;       
    }//Fin del metodo buscarDedicacionByColumn()
 
    /**
     * <hr>
     * Lista todas las dedicaciones que tiene como valor el keysCriterio en la columna claves de la tabla.
     * <hr>
     * @param keysCriterio es el criterio de una dedicacion a buscar
     * @return DefaultTableModel la tabla con todas las dedicaciones que cumplen con dicho criterio
     */
    public DefaultTableModel buscarDedicacionByKeys(String[] keysCriterio) {
        JPA jpa = new JPA();
        Object[] vector = new Object[5];
        DefaultTableModel tabla = (DefaultTableModel) dedicacionView.getModeloTabla();
        String[] keys = {"DNIdocente", "codFacultad"};
        ResultSet res = jpa.showLikeByKeys("pertenece", keys, keysCriterio);
        try {
            while (res.next()) {    //Existe siguiente registro.
                vector[0] = false;
                vector[1] = res.getObject(1);
                vector[2] = res.getObject(2);
                vector[3] = res.getObject(3);
                vector[4] = res.getObject(4);                    
                tabla.addRow(vector);
            }
         } catch (SQLException ex) { //No existe siguiente registro.
            ex.printStackTrace();
         }
         return tabla;        
    }//Fin del metodo buscarDedicacionByKeys()
 
    /**
     * <hr>
     * windowClosing():metodo que recibe un evento de una ventana y dependiendo de
     * este evento realiza las operaciones necesarias.
     * <hr>
     * @param e 
     */     
    @Override
    public void windowClosing(WindowEvent e) {
            principalController.setView();
    }//Fin del metodo windowClosing()
    
// </editor-fold>    
    
// <editor-fold defaultstate="collapsed" desc="Metodos ActionPerformed no usadas"> 
    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void windowOpened(WindowEvent e) {
    }

    @Override
    public void windowClosed(WindowEvent e) {
    }

    @Override
    public void windowIconified(WindowEvent e) {
    }

    @Override
    public void windowDeiconified(WindowEvent e) {
    }

    @Override
    public void windowActivated(WindowEvent e) {
    }

    @Override
    public void windowDeactivated(WindowEvent e) {
    }
// </editor-fold>    
    
}//Fin de la clase ResolucionController
